package com.jiazhong.ssm.test01整合.config;


import com.github.pagehelper.PageInterceptor;
import org.apache.ibatis.logging.slf4j.Slf4jImpl;
import org.apache.ibatis.session.AutoMappingBehavior;
import org.mybatis.spring.SqlSessionFactoryBean;
import org.mybatis.spring.mapper.MapperScannerConfigurer;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;


import javax.sql.DataSource;
import java.util.Properties;

/**
 * @Auther:shuXin
 */
@Configuration
public class MapperJavaConfigNew {
    //获得mybatis-config.xml来进行关联
    @Bean
    public SqlSessionFactoryBean sqlSessionFactory(DataSource dataSource) {
        SqlSessionFactoryBean sqlSessionFactoryBean = new SqlSessionFactoryBean();
        sqlSessionFactoryBean.setDataSource(dataSource);
        //指定mybatis配置文件的功能，使用代码的形式
        // 创建MyBatis核心配置类Configuration实例，封装MyBatis所有核心配置（对应MyBatis配置的<configuration>）
        org.apache.ibatis.session.Configuration configuration
                = new org.apache.ibatis.session.Configuration();
        // 开启下划线转驼峰自动映射：数据库字段user_name → Java实体类属性userName（无需手动写<result>映射）
        // 等价于MyBatis配置：<setting name="mapUnderscoreToCamelCase" value="true"/>
        configuration.setMapUnderscoreToCamelCase(false);
        // 指定MyBatis日志实现为SLF4J（需引入logback/log4j2等SLF4J依赖），用于输出SQL执行日志（SQL语句、参数、执行时间）
        // 等价于MyBatis配置：<setting name="logImpl" value="SLF4J"/>
        configuration.setLogImpl(Slf4jImpl.class);
        // 设置自动映射行为为FULL：自动映射所有简单属性（包括关联对象association中的简单属性）
        // 可选值：NONE(关闭自动映射)、PARTIAL(默认，只映射非嵌套属性)、FULL(全量映射)
        // 等价于MyBatis配置：<setting name="autoMappingBehavior" value="FULL"/>
        configuration.setAutoMappingBehavior(AutoMappingBehavior.FULL);

        // 将配置好的Configuration对象注入SqlSessionFactoryBean，让工厂基于这些配置生成SqlSessionFactory
        sqlSessionFactoryBean.setConfiguration(configuration);

        // 设置实体类别名包：MyBatis自动给com.jiazhong.ssm.pojo下的类生成别名（User→user）
        // 后续Mapper XML中可直接用resultType="user"替代全类名com.jiazhong.ssm.pojo.User
        // 等价于MyBatis配置：<typeAliases><package name="com.jiazhong.ssm.pojo"/></typeAliases>
        sqlSessionFactoryBean.setTypeAliasesPackage("com.jiazhong.ssm.test01整合.pojo");
        // 创建PageHelper分页插件的拦截器实例（需引入com.github.pagehelper:pagehelper依赖）
        PageInterceptor pageInterceptor = new PageInterceptor();
        // 创建Properties对象存储分页插件配置属性
        Properties properties = new Properties();
        // 配置分页插件的数据库方言为MySQL：插件会自动生成MySQL对应的分页SQL（LIMIT语句）
        // 其他方言：oracle/sqlserver等，需根据实际数据库修改
        properties.setProperty("helperDialect","mysql");
        // 将配置属性注入分页插件
        pageInterceptor.setProperties(properties);
        // 给SqlSessionFactoryBean注册分页插件，MyBatis执行SQL时会被插件拦截并拼接分页语句
        // 等价于MyBatis配置：<plugins><plugin interceptor="com.github.pagehelper.PageInterceptor">...</plugin></plugins>
        sqlSessionFactoryBean.addPlugins(pageInterceptor);
        // 将配置完成的SqlSessionFactoryBean返回给Spring容器，Spring会自动调用其getObject()生成SqlSessionFactory
        return sqlSessionFactoryBean;

    }

    //将Mapper的包注入到ioc的容器当中
    @Bean
    public MapperScannerConfigurer mapperScannerConfigurer() {
        MapperScannerConfigurer mapperScannerConfigurer = new MapperScannerConfigurer();
        mapperScannerConfigurer.setBasePackage("com.jiazhong.ssm.test01整合.mapper");
        return mapperScannerConfigurer;
    }
}
